// 封装购物车模块

import { defineStore } from "pinia"
import { computed, ref } from 'vue'
import { useUserStore } from './user'
import { insertCartAPI, getCartListAPI, delCartAPI } from '@/apis/cart'

export const useCartStore = defineStore('cart', () => {
  const userStore = useUserStore()
  const isLogin = computed(() => userStore.userInfo.token)
  // 1.定义 state
  const cartList = ref([])
  // 2.定义 action
  // (10) 获取最新的购物车数据 -- 封装成一个函数便于调用
  const updateNewList = async() => {
    const res = await getCartListAPI()
    cartList.value = res.result
  }
  // (1) 添加购物车操作 
  const addCart = async (goods) => {
    const { skuId, count } = goods
     // (9) 接口购物车 - 登录后的添加购物车 -- 先添加到 后台的购物车, 然后拿到后台购物车列表赋值给 现在的 cartList
    if (isLogin.value) {
      await insertCartAPI({skuId,count})
      updateNewList()
    } else {
      // 本地购物车 - 需要判断 skuid 是否已经存在, 若存在, 则 count +1, 若不存在则, push
      // find 返回一个满足条件的新数组 -- 通过传过来的 goods 的 skuid 查找 在 购物车数组里有没有
      const item = cartList.value.find(item => goods.skuId === item.skuId)
      if (item) {
        item.count++
      } else {
        cartList.value.push(goods)
      }
    }
  }
  // (2) 删除购物车
  const delCart = async(skuId) => {
    // (9) 登录后的删除购物车
    if(isLogin.value) 
    {
      // 要注意这里的接口 接收的是一个数组, 加上 [] 就能转成数组
      await delCartAPI([skuId])
      updateNewList()
    } else {
    // 思路(两种):
    // 1.找到删除项的下标值 -- splice -- findIndex 找索引 -- splice (从哪项开始, 删除几个)
    // const index = cartList.value.findIndex(item => skuId === item.skuId )
    // cartList.value.splice(index,1)
    // 2.使用数组的过滤方法 -- filter
    cartList.value = cartList.value.filter(item => item.skuId !== skuId )
    }
  }
  // (11) 清除购物车
  const clearCart = () => {
    cartList.value = []
  }
    // (4) 单选功能
    const singleCheck = (skuId, selected) => {
      // 通过 skuId 找到要修改的那一项 然后把它的 selected修改为传过来的 selected
      const item = cartList.value.find(item => item.skuId === skuId)
      item.selected = selected
  }
  // (6) 全选功能 -- 全选框的值靠组件那边传过来
  const allCheck = (selected) => {
    cartList.value.forEach(item => item.selected = selected)
  }
  // (3) 计算属性 - 计算总数量和总价格
  // 1. 计算总数量
  const totalCount = computed(() => cartList.value.reduce((sum, item) => sum + item.count, 0))
  // 2. 计算总价格
  const totalPrice = computed(() => cartList.value.reduce((sum, item) => sum + item.count * item.price, 0))
  // (5) 反选功能
  const isAll = computed(() => cartList.value.every(item => item.selected))
  // (7) 已选择数量
  const selectedCount = computed(() => cartList.value.filter(item => item.selected).reduce((sum, item) => sum + item.count, 0))
  // (8) 已选择商品价格合计
  const selectedPrice = computed(() => cartList.value.filter(item => item.selected).reduce((sum, item) => sum + item.count * item.price, 0))
  return {
    cartList,    
    addCart,
    delCart,
    totalCount,
    totalPrice,
    singleCheck,
    isAll,
    allCheck,
    selectedCount,
    selectedPrice,
    clearCart,
    updateNewList 
  }
},
// 持久化操作
{
  persist: true,
})